// app.js
App({
  /**
   * 当小程序初始化完成时，会触发 onLaunch（全局只触发一次）
   */
  onLaunch() {
    console.log('小程序启动 onLaunch');
    // 调用静默登录方法
    this.silentLogin();
  },

  /**
   * 全局数据
   * 可以在任何页面通过 const app = getApp() 来获取
   */
  globalData: {
    userInfo: null, // 存储从后端获取的用户信息
    token: null,    // 存储登录凭证
    isLoggedIn: false, // 标记登录状态
  },

  /**
   * ======================================================
   * 【核心实现】静默登录方法
   * ======================================================
   */
  async silentLogin() {
    // 步骤1: 尝试从本地存储中获取旧的Token
    const token = wx.getStorageSync('token');
    
    // 如果Token存在，我们暂时认为用户已登录。
    // 更严谨的做法是再加一步：调用一个后端接口(如/user/info)来验证Token是否真的有效。
    // 为简化流程，我们先采用“有Token即视为已登录”的策略。
    if (token) {
      console.log('app.js: 检测到本地存在Token，视为已登录。');
      this.globalData.token = token;
      this.globalData.isLoggedIn = true;
      return; // 中断后续登录流程
    }

    console.log('app.js: 未检测到本地Token，开始静默登录...');
    try {
      // 步骤2: 如果没有Token，则调用 wx.login() 获取 code
      const loginRes = await wx.login();
      if (loginRes.code) {
        
        // 步骤3: 调用后端的登录接口，注意此时不传递 userInfo
        const serverRes = await this.wxRequestPromise({
          url: '/api/wechat/login',
          method: 'POST',
          data: {
            code: loginRes.code
            // 静默登录，不包含userInfo
          }
        });

        if (serverRes && serverRes.code === 200) {
          // 步骤4: 登录成功，获取后端返回的新Token
          const newToken = serverRes.data.token;
          console.log('app.js: 静默登录成功，获取到新Token并已存储。');
          
          // 将新Token存入本地存储和全局变量
          wx.setStorageSync('token', newToken);
          this.globalData.token = newToken;
          this.globalData.isLoggedIn = true;

        } else {
          // 后端返回了业务错误
          throw new Error(serverRes.message || '静默登录服务端返回错误');
        }
      } else {
        // wx.login() 调用本身失败
        throw new Error('wx.login() 调用失败');
      }
    } catch (error) {
      // 整个静默登录流程中出现任何错误，都在此捕获
      console.error('app.js: 静默登录流程失败:', error);
      // 失败后，用户保持未登录状态，应用可继续正常运行
      this.globalData.isLoggedIn = false;
    }
  },

  /**
   * ======================================================
   * 【辅助方法】全局网络请求封装
   * ======================================================
   */
  wxRequestPromise(options) {
    const apiBaseUrl = 'http://iw6i1vjj93ml.guyubao.com';
    const finalUrl = apiBaseUrl + options.url;
    
    console.log(`[app.js] 发起请求: ${options.method || 'GET'} ${finalUrl}`);

    return new Promise((resolve, reject) => {
      wx.request({
        ...options,
        url: finalUrl,
        success: (res) => {
          if (res.statusCode >= 200 && res.statusCode < 300) {
            resolve(res.data);
          } else {
            reject(new Error(`请求失败: ${res.statusCode}`));
          }
        },
        fail: (err) => {
          reject(new Error(`网络错误: ${err.errMsg}`));
        }
      });
    });
  }
})